package com.thinkgem.jeesite.modules.crawler.utils;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;

/**
 * 本业务系统相关、使用到的一些常用方法
 * @author clz
 * @date 2016-12-22
 */
public class CommonUtils {
	
	/**
	 * 获取常用年度下拉列表
	 * 由系统设置的年份开始，向前推6年
	 * @return
	 * @see GlobalSetting
	 */
	public static List<String> getYears(){	
		List<String> list = new ArrayList<String>();
		Integer currentYear = DateUtil.getCurrentYear();
		for(int i=-1;i<6;i++){
			list.add(currentYear+i+"");
		}
		return list;
	}
	
	/**
	 * 获取常用年度下拉列表
	 * 由系统设置的年份开始，向后推N年
	 * @return
	 * @see GlobalSetting
	 */
	public static List<Integer> getYearsLast(Integer amount){	
		amount = amount==null?6:amount;
		List<Integer> list = new ArrayList<Integer>();
		Integer currentYear = DateUtil.getCurrentYear();
		for(int i=amount;i>=0;i--){
			list.add(currentYear-i);
		}
		return list;
	}
	
	/**
	 * 获取12个月份
	 * @return
	 */
	public static List<CommonBean> getMonthList(){	
		List<CommonBean> list = new ArrayList<CommonBean>();
		for(int i=1;i<=12;i++){
			CommonBean c = new CommonBean();
			c.setValue(i+"");
			c.setLabel(i+"月");
			list.add(c);
		}
		return list;
	}

	/**
	 * 一年中的4个季度
	 * @return
	 */
	public static List<CommonBean> getQuarterList(){	
		
		List<CommonBean> list = new ArrayList<CommonBean>();		
		for(int i=1;i<=4;i++){
			CommonBean c = new CommonBean();
			c.setValue(i+"");
			c.setLabel("第"+i+"季度");
			list.add(c);
		}
		return list;
	}

	
	/**
	 * 周一到周日
	 * 用1-7表示
	 * @return
	 */
	public static List<CommonBean> getWeekList(){	
		
		List<CommonBean> list = new ArrayList<CommonBean>();	
		
		CommonBean c1 = new CommonBean();
		c1.setValue("1");
		c1.setLabel("周一");

		CommonBean c2 = new CommonBean();
		c2.setValue("2");
		c2.setLabel("周二");
		
		CommonBean c3 = new CommonBean();
		c3.setValue("3");
		c3.setLabel("周三");
		
		
		CommonBean c4 = new CommonBean();
		c4.setValue("4");
		c4.setLabel("周四");
		
		
		CommonBean c5 = new CommonBean();
		c5.setValue("5");
		c5.setLabel("周五");
		
		
		CommonBean c6 = new CommonBean();
		c6.setValue("6");
		c6.setLabel("周六");
		
		
		CommonBean c7 = new CommonBean();
		c7.setValue("7");
		c7.setLabel("周日");

		
		list.add(c1);
		list.add(c2);
		list.add(c3);
		list.add(c4);
		list.add(c5);
		list.add(c6);
		list.add(c7);
		
		return list;
	}


	/**
	 * 季度中的1-3个月下拉列表
	 * 用1-7表示
	 * @return
	 */
	public static List<CommonBean> getMonth3List(){	
		
		List<CommonBean> list = new ArrayList<CommonBean>();			
		CommonBean c1 = new CommonBean();
		c1.setValue("1");
		c1.setLabel("第一个月");

		CommonBean c2 = new CommonBean();
		c2.setValue("2");
		c2.setLabel("第二个月");
		
		CommonBean c3 = new CommonBean();
		c3.setValue("3");
		c3.setLabel("第三个月");
		
		list.add(c1);
		list.add(c2);
		list.add(c3);

		
		return list;
	}
	
	
	
	/**
	 * 获取常用年度下拉列表
	 * 由系统设置的年份开始，自定义后推跨度
	 * @param span 跨度(默认为10)
	 * @param subtrahend 减数(默认为0)
	 * @return
	 */
	public static List<Integer> getYearListCustom(Integer span,Integer subtrahend){
		span=span==null?10:span;
		subtrahend=subtrahend==null?0:subtrahend;
		List<Integer> list = new ArrayList<Integer>();
		Integer currentYear = DateUtil.getCurrentYear();
		currentYear=currentYear-subtrahend;
		for(int i=span;i>=0;i--){
			list.add(currentYear-i);
		}
		return list;
	}

	
	/**
	 * 获取1-31号（不带0开头的）
	 * @return
	 */
	public static List<CommonBean> getDayList(){	
		List<CommonBean> list = new ArrayList<CommonBean>();
		for(int i=1;i<=31;i++){
			CommonBean c = new CommonBean();
			c.setValue(i+"");
			c.setLabel(i+"号");
			list.add(c);
		}
		return list;
	}
	
	/**
	 * 获取连续N天
	 * @return
	 * @throws Exception 
	 */
	public static List<String> getDays(int n) throws Exception{	
		List<String> list = new ArrayList<String>();
		Date now = new Date();
		String nowDay = DateUtil.formatDateToString(now, "yyyy-MM-dd");
        
		for(int i=1;i<n;i++){
			Date nd = DateUtil.getDate(now, 0, 0, i-n);
			String nDay = DateUtil.formatDateToString(nd, "yyyy-MM-dd");
			list.add(nDay);
		}
		list.add(nowDay);
		return list;
	}
	



    public static Double formatDouble(Double d){
        if(d==null)
            return 0d;
        DecimalFormat decimalFormat = new DecimalFormat("#.0");
        return Double.parseDouble(decimalFormat.format(d));
    }
	
    public static String getUUID(){
    	return UUID.randomUUID().toString().replaceAll("-", "");
    }
    

	/**
	 * 主要用于解决桌面通知公告标题过长 自动切割保留一定长度的问题
	 * @param str
	 * @param length
	 */
	public static String trimContents(String str){
		int length = 28;		
		if(StringUtils.isEmpty(str)){
			return "";
		}
		if(str.length()<length){
			return str;
		}else{
			return str.substring(0,length)+"...";
		}
	}
	
	/**
	 * 保留小数的功能
	 * */
	public static Double retainDecimal(Double value,Integer number){
		if(value==null)
			return 0d;
		BigDecimal b = new BigDecimal(value);
		value = b.setScale(number, BigDecimal.ROUND_HALF_UP).doubleValue(); // 保留两位小数
		return value;
	}
	
	public static Float retainDecimal(Float value,Integer number){
		if(value==null)
			return 0f;
		BigDecimal b = new BigDecimal(value);
		value = b.setScale(number, BigDecimal.ROUND_HALF_UP).floatValue(); // 保留n位小数
		return value;
	}
	

	
	/**
	 * 默认调用这个方法，系统保留2小数点
	 * @param value
	 * @return
	 */
	public static Float retainDecimalDefault(Float value){
		if(value!=null){
			BigDecimal b = new BigDecimal(value);
			value = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue(); // 保留两位小数	
		}
		return value;
	} 
	
	
	/**
	 * 默认调用这个方法，系统保留2小数点
	 * @param value
	 * @return
	 */
	public static Double retainDecimalDefault(Double value){
		if(value!=null){
			BigDecimal b = new BigDecimal(value);
			value = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); // 保留两位小数	
		}
		return value;
	} 
	
	public static String retainDecimalToString(Float d, int len) {
		d = round(d, len);
		String format = "#,##0";
		if (len > 0) {
			format = format + ".";
			for (int i = 0; i < len; ++i) {
				format = format + "0";
			}
		}

		return format(Double.valueOf(d), format);
	}

	public static String retainDecimalToString(Float d) {
		d = round(d, 2);
		return format(Float.valueOf(d), "###0.00");
	}
	
	public static String retainDecimalToString(Double d) {
		d = round(d, 2);
		return format(Double.valueOf(d), "###0.00");
	}
	
    
	public static Float round(Float d, int len) {
		BigDecimal big = new BigDecimal(d).setScale(len, 4);
		d = big.floatValue();
		return d;
	}
	
	public static Double round(Double d, int len) {
		BigDecimal big = new BigDecimal(d).setScale(len, 4);
		d = big.doubleValue();
		return d;
	}
	
	
	public static String format(Object number, String format) {
		return new DecimalFormat(format).format(number);
	}
	
	
	/**
	 * 去掉字符串两头的 逗号，
	 * @param value
	 * @return
	 */
	public static String trimComma(String value){
		if(value!=null){
			if(value.startsWith(","))
				value = value.substring(1,value.length());
			if(value.endsWith(","))
				value = value.substring(0,value.length()-1);
			return value;
		}
	    return null;
	} 
	/**
	 * 去掉两段的 ; 号
	 * @param value
	 * @return
	 */
	public static String trimSemicolon(String value){
		if(value!=null){
			if(value.startsWith(";"))
				value = value.substring(1,value.length());
			if(value.endsWith(";"))
				value = value.substring(0,value.length()-1);
			return value;
		}
	    return null;
	} 
	
	
	/**
	 * 是否包含
	 * @param values 格式： 222,222,222
	 * @param value 如果是 空，是包含。格式：222
	 * @return
	 */
	public static Boolean isContain(String values,String value){
		if(StringUtils.isEmpty(values))
			return false;		
		if(StringUtils.isEmpty(value))
			return true;		
		String[] _values = values.split(",");
		
		for(String v:_values){
			if(v.equals(value))
				return true;
		}
		return false;
	} 
	
	/**
	 * 计算进位；例如 一年中的 第4旬，是属于第2个月的，这个2是进位。
	 * @param step
	 * @param last
	 * @return
	 * @throws Exception
	 */
	public static Integer calCarryByCrossStep(Integer step,Integer last) throws Exception{
		int e = last/step;
		int i = last%step;
		if(i==0){
			return e-1;
		}else{
			return e;
		}
	}
	
	
	/**
	 <b>function:</b> 处理oracle sql 语句in子句中（where id in (1, 2, ..., 1000, 1001)），
	 * 如果子句中超过1000项就会报错。
	 * 这主要是oracle考虑性能问题做的限制。
	 * 如果要解决次问题，可以用 where id (1, 2, ..., 1000) or id (1001, ...)
	 * @param riskIds
	 * @param field
	 * @return
	 */
	public static String getSubQuery(String riskIds,String field){  
        StringBuffer subQ = new StringBuffer();  
        subQ.append(field +" in (");  
        if(!StringUtils.isEmpty(riskIds)){  
            String[] riskIDs = riskIds.split(",");  
            if(riskIDs.length>1000){  
                for(int i=0;i<riskIDs.length;i++){  
                    if((i%1000)>= 999){  
                        String temp = subQ.substring(0, subQ.length()-1);  
                        subQ.delete(0, subQ.length());  
                        subQ.append(temp);  
                        subQ.append(") or "+field+" in (");  
                        subQ.append(riskIDs[i]+",");  
                    }else{  
                        subQ.append(riskIDs[i]+",");  
                    }  
                }  
                String temp = subQ.substring(0, subQ.length()-1);  
                subQ.delete(0, subQ.length());  
                subQ.append(temp);  
                subQ.append(")");  
            }else{  
                subQ.append(riskIds);  
                subQ.append(")");  
            }  
        }else{  
            subQ.append(")");  
        }  
        return subQ.toString();  
    } 
	
	/**
	 * 将double类型转换成字符串（用非科学计算法），可以保留小数后几位
	 * @author mj 2017/2/24
	 * @param  value
	 * @return valueStr
	 */
	public static String doubleToStrRetain(Double value, Integer number){
		if(value == null){
			return "";
		}
		if(number != null){
			value = CommonUtils.retainDecimal(value, number);
		}
		String valueStr = "";
		NumberFormat nFormat = NumberFormat.getInstance();
		nFormat.setGroupingUsed(false);
		nFormat.setMaximumFractionDigits(12);
		valueStr = nFormat.format(value);
		return valueStr;
	}
	
	/**
	 * 去掉多余的0，可设置保留小数位数
	 * @author mj 2017/4/6
	 * @param  value
	 * @return bigDecimalStr
	 */
	public static String bigDecimalHelper(BigDecimal value, Integer retainNum) {
		if(value == null) {
			return null;
		}
		String bigDecimalStr = "";
		if((retainNum == null) || (retainNum.intValue() <= 0) ) {
			if(value.compareTo(new BigDecimal("0")) == 0) {
				bigDecimalStr = "0";
			} else {
				bigDecimalStr = value.stripTrailingZeros().toPlainString();
			}
		} else {
			bigDecimalStr = value.setScale(retainNum, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString();
		}
		return bigDecimalStr;
	}
	
}
